package com.itheima.controller;

import com.itheima.pojo.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@RestController
public class RequestController {

    /*
        简单参数处理方式
        需求1 : 定义simpleParam方法 , 使用原始方式完成简单参数接收

     */
    @RequestMapping("/method1")
    public String method1(HttpServletRequest httpServletRequest) {
        String name = httpServletRequest.getParameter("name");
        String age = httpServletRequest.getParameter("age");
        System.out.println(name);
        System.out.println(age);
        return "ok";
    }


    /*
       简单参数处理方式
           1 : 参数名与形参变量名相同，定义形参即可接收参数
           2 : 类型可以自动类型转换,基本类型需要使用包装类类型接收
           3 : 如果方法形参名称与请求参数名称不匹配，可以使用 @RequestParam 完成映射
       需求2 :  定义方法simpleParam , 使用SpringBoot方式完成简单参数接收
    */
    @RequestMapping("/method2")
    public String method2(String name, String age) {
        System.out.println(name);
        System.out.println(age);
        return "ok";
    }


    /*
        简单实体对象案例

        注意 : 简单实体对象：前端传入参数名与 POJO 属性名相同，定义POJO接收即可
        需求3 : 定义User类, User类中包含name和age属性
        定义simplePojo方法 , 使用简单实体对象接收前端数据
     */
    @RequestMapping("/method3")
    public String method3(User user) {
        System.out.println(user);
        return "ok";
    }


    /*
       复杂实体对象案例

       注意 : 复杂实体对象：请求参数名与形参对象属性名相同，按照对象层次结构关系即可接收嵌套POJO属性参数。
       需求4 : 定义User类和Address类, User类中包含name和age属性 , Address类中包含province和city属性
       定义complexPojo方法 , 使用复杂实体对象接收前端参数数据
    */
    @RequestMapping("/method4")
    public String method4(User user) {
        System.out.println(user);
        return "ok";
    }

    /*
        数组参数：请求参数为多个且参数的键是相同的，定义数组类型形参即可接收参数

        需求5 : 定义arrayParam方法 , 使用数组接收前端参数数据
     */
    @RequestMapping("/method5")
    public String method5(String[] user) {
        System.out.println(Arrays.toString(user));
        return "ok";
    }

    /*
        集合参数：请求参数为多个且参数的键是相同的，使用集合参数接收并使用@RequestParam 绑定参数关系

        需求6 : 定义listParam方法 , 使用集合接收前端参数数据
   */
    @RequestMapping("/method6")
    public String method6(@RequestParam List<String> users) {
        System.out.println(users);
        return "ok";
    }


    /*
        日期参数：前端请求的参数是一个日期, 使用日期参数接收且使用 @DateTimeFormat 注解完成日期参数格式转换

        需求7 : 定义dateParam方法 , 使用LocalDateTime接收前端参数数据
     */
    @RequestMapping("/method7")
    public String method7(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime localDateTime) {
        System.out.println(localDateTime);
        return "ok";
    }

    /*
        JSON参数：请求参数是JSON数据, 使用POJO类型接收参数。需使用 @RequestBody 标识

        需求8 : 定义jsonParam方法 , 使用实体类对象接收前端参数数据
     */
    @RequestMapping("/method8")
    public String method8(@RequestBody User user) {
        System.out.println(user);
        return "ok";
    }

    /*
        路径参数：通过请求URL直接传递参数，使用{…}来标识该路径参数，需要使用 @PathVariable 获取路径参数

        需求9 : 定义pathParam方法 , 使用{…}来接收传递过来的参数
     */
    @RequestMapping("/method9/{id}/{name}/{id2}")
    public String method9(@PathVariable Integer id, @PathVariable String name, @PathVariable Integer id2) {
        System.out.println(id);
        System.out.println(id2);
        System.out.println(name);
        return "ok";
    }

}